/**
 * 
 */
package com.tomagency.cyberlab.client.ui;

import java.util.Hashtable;
import java.util.List;

import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.HasClickHandlers;
import com.google.gwt.user.client.ui.HasValue;
import com.google.gwt.user.client.ui.Widget;
import com.tomagency.cyberlab.client.events.BelegEvent;
import com.tomagency.cyberlab.client.events.ObjectEvent;
import com.tomagency.cyberlab.client.events.WindowScrollEvent;
import com.tomagency.cyberlab.client.events.WindowScrollEventHandler;

import de.gammadata.gwt.proxy.PersistenceBeanListProxy;

/**
 * @author gfr
 *
 */
public interface ObjectListenView  {

	/**
	 * 
	 * @return Inhalt als Widget
	 */
	public Widget asWidget();
	/**
	 * 
	 * @param presenter Presenter == View Controller
	 */
	public void setPresenter(Presenter presenter);
	/**
	 * 
	 * @return presenter Presenter == View Controller
	 */
	public Presenter getPresenter();
	/**
	 * 
	 * @param handler ObjectEventHandler entspricht in der regel dem Presenter
	 */
	public void setObjectEventHandler(ObjectEventHandler handler);
	
	public ObjectEventHandler getObjectEventHandler();
	
	/**
	 * 
	 * @param bez ObjektBezeichnung zur Benennung der dargestellten Objektart
	 */
	public void setObjektBezeichnung(String bez);
	
	/**
	 * initialer Aufbau der View Objekts
	 */
	public void render();
	/**
	 * 
	 * @param dataList Liste der Objekte, die in einer Tabelle dargestellt werden
	 */
	public void setObjectList(List dataList);
	
	public List getObjectList();
	/**
	 * Die Objektliste wird als tabelle aufgebaut 
	 * @param startObjectNr in Liste
	 * @param anzahlObjekte 
	 * @param startRow StartZeile in der gerenderten Objekt-Tabelle
	 */
	public void renderObjectList(int startObjectNr, int anzahlObjekte, int startRow, RenderType renderType);
	/**
	 * Die Tabelle die die Objektliste darstellt wird gelöscht;
	 */
	public void clearListenTabelle();
	/**
	 * 
	 * @return int Anzahl der Reihen in der Objekttabelle
	 */
	public int getRowCount();
	
//	public int getClickedRow(ClickEvent event);
	/**
	 * 
	 * @param msg Message neben Suchfeld
	 */
	public void setMessage(String msg);
	
	/**
	 * 
	 * @return absoluteBottom des Containers in px
	 */
	public int getAbsoluteBottom();
	/**
	 * 
	 * @return absoluteRight des Containers in px
	 */
	public int getAbsoluteRight();
	
//	public void setCellRendererList(List<CellRenderer<T>> renderer);
//	public List<CellRenderer<T>> getCellRendererList();
	
	public RowRenderer getRowRenderer();
	public void setRowRenderer(RowRenderer rowRenderer);

	public enum RenderType {LIST,SHORT,MEDIUM,FULL,EDIT};
	public enum RowType{STANDARD,EVEN,ODD,SELECTED};
	
	public interface RowRenderer<H extends ObjectEvent>{
		public List<CellRenderer<H>> getCellRendererList(RenderType renderType);
	}
	
	public interface CellRenderer<H extends ObjectEvent>{
		public Widget getColumnWidget(RowType rowType,ObjectEventHandler<H> handler,Object dataObj);
		public int getColSpan();
	}
	
//	public interface EditHandler {
//		public void onEdit();
//		public void onSave();
//	}
	
  public interface Presenter<H extends ObjectEvent> extends WindowScrollEventHandler{
	  public String getUid();
	  public void setUid(String uid);
	  public void onShowAllClicked();
	  public void onSearchClicked(String searchText);
	  public  void onObjectClicked(int rowNr,int objectId);
	  public void onObjectEvent(H event);
	  public void onCollapseObjectClicked(int objectId);

//	    void onObjectSelected(T selectedObject);
	  }
    
  public interface ObjectEventHandler<H extends ObjectEvent>{
	  public void onObjectEvent(H event);
	  public void onObjectCollapseEvent(ObjectEvent event);
	  
  }
}
